/*
 * Copyright 2010 Michael Nitsche
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package de.mnit.basis.sys;

import java.io.IOException;
import java.io.RandomAccessFile;

import de.mnit.basis.daten.typ.zeit.Zeitpunkt;
import de.mnit.basis.daten.typ.zeit.format.FormatZeit;
import de.mnit.basis.fehler.Fehler;
import de.mnit.basis.fehler.system.F_Sys_Datei;
import de.mnit.basis.sys.datei.DSLokal;
import de.mnit.basis.sys.datei.S_Datei;
import de.mnit.basis.sys.datei.S_Ordner;

/**
 * @author Michael Nitsche
 * 06.03.2007	Erstellt
 *
 * TODO Ausgabe muß auch umgeleitet werden können! Derzeit nur manuell möglich
 * TODO Vor der Freigabe überarbeiten!!!
 */
public class Log {

	public static void main(String[] args) {
		try {
			Log.neu(DSLokal.temp(),"testlog");
			Log.schreib("Hallo");
			Log.schreib("Ok");
		}
		catch(F_Sys_Datei e) {
			Fehler.zeig(e);
		}
	}


	private static Log log=null;
	private S_Datei dateiz=null;


	public Log(S_Ordner ordner, String dateititel) throws F_Sys_Datei {
		dateiz=ordner.dF(dateititel+"_"+(FormatZeit.zuTextDS(Zeitpunkt.neu())), "txt");

//		Runtime.getRuntime().addShutdownHook( new Thread(){
//			public void run() {
//				try {
//					osw.close();
//				}
//				catch(IOException e)   { Fehler.zeig(e); }
//			}
//		});
	}

	/**
	 * Nur eine einfache Log-Instanz anlegen
	 */
	public static void neu(S_Ordner ordner, String datei) throws F_Sys_Datei {
		Ausgabe.sDetailliert();
		if(gAktiv()) Fehler.sonstige.da_Untypisch("Log bereits initialisiert!");
		else log=new Log(ordner,datei);
	}

	/**
	 * Registriert die neue Log-Instanz auch gleich in Ausgabe
	 */
	public static void neu(S_Ordner ordner, boolean produktiv) {
		if(gAktiv())
			throw Fehler.sonstige.da_Untypisch("Log bereits initialisiert!");
		else {
			try {
				log=new Log(ordner, "log");
			}
			catch(F_Sys_Datei e) {
				Fehler.zeig(e);
				return;
			}
			if(produktiv) Ausgabe.sProduktiv();
			Ausgabe.aktiviereLog();
		}
	}

	/**
	 * Registriert die neue Log-Instanz auch gleich in Ausgabe
	 */
	public static void neu(String anw_name, boolean produktiv) {
		S_Ordner ordner=null;
		try {
			ordner = DSLokal.gOrdnerAnwNitsche(anw_name).oF("Logs");
		}
		catch(F_Sys_Datei e) {
			Fehler.zeig(e);
			return;
		}
		neu(ordner, produktiv);
	}

	public static boolean gAktiv() {
		return log!=null;
	}

	public static void schreib(String text) {
		log.iSchreib(text);
	}

	// INTERN

	private void iSchreib(String text) {
		RandomAccessFile datei=null;
		try {
			datei = new RandomAccessFile( dateiz.gFile(), "rw" );
			datei.seek( datei.length() );      // Dateizeiger an das Ende setzen.
			datei.writeBytes(Zeitpunkt.neu()+"\n"+text+"\n" ); // Die Zeile schreiben.
		}
		catch(Exception e)   { Fehler.zeig(e); }
		finally {
			if( datei != null )
				try { datei.close(); } catch ( IOException e ) { Fehler.zeig(e); }
		}
	}

}
